import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt

# 获取大唐发电历史数据（2024年至今）
stock_code = "601991"
df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date="20240101", end_date="20250804", adjust="qfq")
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
print(f"数据最新日期: {df.index[-1].strftime('%Y-%m-%d')}")  # 输出：2025-08-04
# 计算均线
df['MA5'] = df['收盘'].rolling(5).mean()
df['MA20'] = df['收盘'].rolling(20).mean()
print(df[['收盘', 'MA5', 'MA20']])
# 生成金叉/死叉信号
df['Signal'] = 0
df.loc[df['MA5'] > df['MA20'], 'Signal'] = 1   # 金叉（买入）
df.loc[df['MA5'] < df['MA20'], 'Signal'] = -1  # 死叉（卖出）

# 输出金叉/死叉信号
print("金叉/死叉信号:")
#print(df[df['Signal'] != 0])

# 输出最近5日 收盘价
print("最近5日收盘价:")
print(df['收盘'].tail(5))

# 计算KDJ指标
n = 9  # 周期
# 计算RSV值
df['最高价'] = df['最高']
df['最低价'] = df['最低']
df['RSV'] = (df['收盘'] - df['最低价'].rolling(n).min()) / (df['最高价'].rolling(n).max() - df['最低价'].rolling(n).min()) * 100
# 计算K值和D值
df['KDJ_K'] = df['RSV'].ewm(com=2, adjust=False).mean()
df['KDJ_D'] = df['KDJ_K'].ewm(com=2, adjust=False).mean()
# 计算J值
df['KDJ_J'] = 3 * df['KDJ_K'] - 2 * df['KDJ_D']

# 输出 最近1年 kdj中k<20 d<20  j<0 的日期 还有股票价格
print("最近1年 kdj中 k<20 d<20 j<0 的日期:")
# 筛选最近1年的数据
one_year_ago = df.index[-1] - pd.DateOffset(years=1)
recent_df = df[df.index >= one_year_ago]
print(recent_df[(recent_df['KDJ_K'] < 20) & (recent_df['KDJ_D'] < 20) & (recent_df['KDJ_J'] < 0)][['KDJ_K','KDJ_D','KDJ_J', '收盘']])
# 输出 最近1年 kdj中k>80 d>80  j>80 的日期 还有股票价格
print("最近1年 kdj中 k>80 d>80 j>80 的日期:")
print(recent_df[(recent_df['KDJ_K'] > 80) & (recent_df['KDJ_D'] > 80) & (recent_df['KDJ_J'] > 80)][['KDJ_K','KDJ_D','KDJ_J', '收盘']])

